
#include "req_handle.h"
#include "log_console.h"
#include <sys/ipc.h>
#include <sys/shm.h>
#include<string.h>
#include<errno.h>
#include <sys/types.h>
#include <sys/msg.h>
#include "cJSON.h"
#include "list.h"
#include <shmem.h>
#include <pthread.h>
#include <msg_queue_peer.h> 
#define KB 1024
#define HTML_SIZE (64 * KB)

/* 
//普通的文本回复需要增加html头部
#define HTML_HEAD "Content-Type: text/html\r\n" \
	"Connection: close\r\n"
*/

#define HTML_HEAD "Content-Type: text/html\r\n" \
    "Connection: close\r\n"

#define JSON_HEAD "Content-Type: application/json\r\n" \
    "Connection: close\r\n"

//消息队列，用于接收上位机下发指令，并给上位机回复寄存器控制是否成功
struct msgbuf
{
    long mtype;     
    char mdata[256];
};

//数据上报格式
union val_t
{ 
    int b_val;  //bool类型存储空间
    int i_val;   //整形值存储空间
    float f_val;  //浮点值存储空间
};

struct std_node
{
	int key;  //唯一键值
	int type;  //数据点类型
    int dev_type;  //属于哪个设备：m0或modbus
	union val_t old_val;  //变化上报后需要更新旧值
    union val_t new_val;  //从共享内存取出最新数据，放到new_val中
    int ret;  //默认为-1，采集成功后设置为0，采集失败再置-1
};

static struct shm_param para;

static int report_json(const char *msg)
{
    char reply_buf[HTML_SIZE] = {0};
    sprintf(reply_buf, "%sContent-Length: %ld\r\n\r\n", JSON_HEAD, strlen(msg));
    strcat(reply_buf, msg);
	//log_console("post json_str = %s", reply_buf);
    fputs(reply_buf, stdout);
    
    return 0;
}

static int report_html(const char *msg)
{
    char reply_buf[HTML_SIZE] = {0};
    sprintf(reply_buf, "%sContent-Length: %ld\r\n\r\n", HTML_HEAD, strlen(msg));
    strcat(reply_buf, msg);
	//log_console("post json_str = %s", reply_buf);
    fputs(reply_buf, stdout);
    
    return 0;
}
/**
 * @brief 处理自定义请求，在这里添加进程通信
 * @param input
 * @return
 
struct msg
{
	long type;
	int buf;
	int op;
	char txt[65];
};
*/

//登录函数
int login(char *input)
{
	char recv_buf[256] = {0};
	strcpy(recv_buf, input);
	
	if(strcmp(recv_buf,"username=123&password=123")==0)
	//if(strcmp(uname, "admin")==0 && strcmp(passwd, "admin")==0)
	{
		log_console("----=======================\n");
    	strcpy(recv_buf, "<script>window.location.href = '/index2.html';</script>");
    	// report_html(recv_buf);
		fputs(recv_buf, stdout);
		return 0;
	}
	else 
	{
		strcpy(recv_buf, "<script charset='UTF-8'>alert('用户名或密码错误');</script>");
		strcat(recv_buf, "<script>window.location.href = '/index.html';</script>");

		fputs(recv_buf, stdout);
		return 1;
	}
	
}

int parse_and_process(char *input)
{
	if(strncmp(input,"username",8)==0)
	{
		return login(input);
	}
	// log_console("------------------\n");
	 char recv_buf[256] = {0};
	 strcpy(recv_buf, input);

	//接收web下发的指令
	cJSON *json_recv = NULL;
    cJSON *node_recv = NULL;
	cJSON *node_recv_data = NULL;
	json_recv = cJSON_Parse(recv_buf);
//	log_console("%s\n",input);
	//用于返回查询的数据上传给web
	cJSON *data_ret = cJSON_CreateObject();
	//上传的数组
	cJSON *data_arr;
	//数组中的成员
	cJSON *M0_data_tmp;
	cJSON *M0_data_hum;
	cJSON *M0_data_ill;

	cJSON *app_data_ill;
	cJSON *app_data_x;
	cJSON *app_data_y;
	cJSON *app_data_z;

	cJSON *modbus_data_tmp;
	cJSON *modbus_data_hum;
	cJSON *modbus_data_air;

	node_recv = cJSON_GetObjectItem(json_recv,"type");
	if(node_recv->valueint == 1)
	{
		

		node_recv_data = cJSON_GetObjectItem(json_recv,"limit");
		//判断如果是全部采集
		if(strncmp(node_recv_data->valuestring,"all",3) == 0)
		{
			//log_console("%d\n", msgrecv[1].key);

			//共享内存M0
    		int ret_t = -1;
    		ret_t = shm_init(&para, "hfs", 1024);
    		if(ret_t < 0)
    		{
        		return -1;
    		}
    
    		struct std_node *msgrecv = shm_getaddr(&para);
    		if(msgsnd == NULL)
    		{
        		return -1;
    		}
			
			//创建json数组
			data_arr = cJSON_CreateArray();
			//创建对象(M0温度)
			M0_data_tmp = cJSON_CreateObject();
			cJSON_AddNumberToObject(M0_data_tmp,"key",msgrecv[0].key);
			//log_console("%d\n",msgrecv[0].key);
			if(msgrecv[0].type == 1)
			{
    			cJSON_AddNumberToObject(M0_data_tmp,"val",msgrecv[0].new_val.b_val);
			}
			else if(msgrecv[0].type == 2)
			{
    			cJSON_AddNumberToObject(M0_data_tmp,"val",msgrecv[0].new_val.i_val);
			}
			else if(msgrecv[0].type == 3)
			{
    			cJSON_AddNumberToObject(M0_data_tmp,"val",msgrecv[0].new_val.f_val);
			}

			//M0湿度
			M0_data_hum = cJSON_CreateObject();
			cJSON_AddNumberToObject(M0_data_hum,"key",msgrecv[1].key);
			//log_console("%d\n",msgrecv[0].key);
			if(msgrecv[1].type == 1)
			{
    			cJSON_AddNumberToObject(M0_data_hum,"val",msgrecv[1].new_val.b_val);
			}
			else if(msgrecv[1].type == 2)
			{
    			cJSON_AddNumberToObject(M0_data_hum,"val",msgrecv[1].new_val.i_val);
			}
			else if(msgrecv[1].type == 3)
			{
    			cJSON_AddNumberToObject(M0_data_hum,"val",msgrecv[1].new_val.f_val);
			}
 
			//M0光照强度
			M0_data_ill = cJSON_CreateObject();
			cJSON_AddNumberToObject(M0_data_ill,"key",msgrecv[2].key);
			//log_console("%d\n",msgrecv[0].key);
			if(msgrecv[2].type == 1)
			{
    			cJSON_AddNumberToObject(M0_data_ill,"val",msgrecv[2].new_val.b_val);
			}
			else if(msgrecv[2].type == 2)
			{
    			cJSON_AddNumberToObject(M0_data_ill,"val",msgrecv[2].new_val.i_val);
			}
			else if(msgrecv[2].type == 3)
			{
    			cJSON_AddNumberToObject(M0_data_ill,"val",msgrecv[2].new_val.f_val);
			}

			//共享内存app
			ret_t = shm_init(&para, "zz", 1024);
    		if(ret_t < 0)
    		{
        		return -1;
    		}
    
    		msgrecv = shm_getaddr(&para);
    		if(msgsnd == NULL)
    		{
        		return -1;
    		}

			app_data_ill = cJSON_CreateObject();
			cJSON_AddNumberToObject(app_data_ill,"key",msgrecv[0].key);
			//log_console("%d\n",msgrecv[0].key);
			if(msgrecv[0].type == 1)
			{
    			cJSON_AddNumberToObject(app_data_ill,"val",msgrecv[0].new_val.b_val);
			}
			else if(msgrecv[0].type == 2)
			{
    			cJSON_AddNumberToObject(app_data_ill,"val",msgrecv[0].new_val.i_val);
			}
			else if(msgrecv[0].type == 3)
			{
    			cJSON_AddNumberToObject(app_data_ill,"val",msgrecv[0].new_val.f_val);
			}

			app_data_x = cJSON_CreateObject();
			cJSON_AddNumberToObject(app_data_x,"key",msgrecv[1].key);
			//log_console("%d\n",msgrecv[0].key);
			if(msgrecv[1].type == 1)
			{
    			cJSON_AddNumberToObject(app_data_x,"val",msgrecv[1].new_val.b_val);
			}
			else if(msgrecv[1].type == 2)
			{
    			cJSON_AddNumberToObject(app_data_x,"val",msgrecv[1].new_val.i_val);
			}
			else if(msgrecv[1].type == 3)
			{
    			cJSON_AddNumberToObject(app_data_x,"val",msgrecv[1].new_val.f_val);
			}

			app_data_y = cJSON_CreateObject();
			cJSON_AddNumberToObject(app_data_y,"key",msgrecv[2].key);
			//log_console("%d\n",msgrecv[0].key);
			if(msgrecv[2].type == 1)
			{
    			cJSON_AddNumberToObject(app_data_y,"val",msgrecv[2].new_val.b_val);
			}
			else if(msgrecv[2].type == 2)
			{
    			cJSON_AddNumberToObject(app_data_y,"val",msgrecv[2].new_val.i_val);
			}
			else if(msgrecv[2].type == 3)
			{
    			cJSON_AddNumberToObject(app_data_y,"val",msgrecv[2].new_val.f_val);
			}

			app_data_z = cJSON_CreateObject();
			cJSON_AddNumberToObject(app_data_z,"key",msgrecv[3].key);
			//log_console("%d\n",msgrecv[0].key);
			if(msgrecv[3].type == 1)
			{
    			cJSON_AddNumberToObject(app_data_z,"val",msgrecv[3].new_val.b_val);
			}
			else if(msgrecv[3].type == 2)
			{
    			cJSON_AddNumberToObject(app_data_z,"val",msgrecv[3].new_val.i_val);
			}
			else if(msgrecv[3].type == 3)
			{
    			cJSON_AddNumberToObject(app_data_z,"val",msgrecv[3].new_val.f_val);
			}

			//共享内存app
			ret_t = shm_init(&para, "ssy", 1024);
    		if(ret_t < 0)
    		{
        		return -1;
    		}
    
    		msgrecv = shm_getaddr(&para);
    		if(msgsnd == NULL)
    		{
        		return -1;
    		}

			modbus_data_tmp = cJSON_CreateObject();
			cJSON_AddNumberToObject(modbus_data_tmp,"key",msgrecv[0].key);
			//log_console("%d\n",msgrecv[0].key);
			if(msgrecv[0].type == 1)
			{
    			cJSON_AddNumberToObject(modbus_data_tmp,"val",msgrecv[0].new_val.b_val);
			}
			else if(msgrecv[0].type == 2)
			{
    			cJSON_AddNumberToObject(modbus_data_tmp,"val",msgrecv[0].new_val.i_val);
			}
			else if(msgrecv[0].type == 3)
			{
    			cJSON_AddNumberToObject(modbus_data_tmp,"val",msgrecv[0].new_val.f_val);
			}

			modbus_data_hum = cJSON_CreateObject();
			cJSON_AddNumberToObject(modbus_data_hum,"key",msgrecv[1].key);
			//log_console("%d\n",msgrecv[0].key);
			if(msgrecv[1].type == 1)
			{
    			cJSON_AddNumberToObject(modbus_data_hum,"val",msgrecv[1].new_val.b_val);
			}
			else if(msgrecv[1].type == 2)
			{
    			cJSON_AddNumberToObject(modbus_data_hum,"val",msgrecv[1].new_val.i_val);
			}
			else if(msgrecv[1].type == 3)
			{
    			cJSON_AddNumberToObject(modbus_data_hum,"val",msgrecv[1].new_val.f_val);
			}

			modbus_data_air = cJSON_CreateObject();
			cJSON_AddNumberToObject(modbus_data_air,"key",msgrecv[3].key);
			//log_console("%d\n",msgrecv[0].key);
			if(msgrecv[3].type == 1)
			{
    			cJSON_AddNumberToObject(modbus_data_air,"val",msgrecv[3].new_val.b_val);
			}
			else if(msgrecv[3].type == 2)
			{
    			cJSON_AddNumberToObject(modbus_data_air,"val",msgrecv[3].new_val.i_val);
			}
			else if(msgrecv[3].type == 3)
			{
    			cJSON_AddNumberToObject(modbus_data_air,"val",msgrecv[3].new_val.f_val);
			}

			//添加对象到数组中
			cJSON_AddItemToArray(data_arr,M0_data_tmp);
			cJSON_AddItemToArray(data_arr,M0_data_hum);
			cJSON_AddItemToArray(data_arr,M0_data_ill);

			cJSON_AddItemToArray(data_arr,app_data_ill);
			cJSON_AddItemToArray(data_arr,app_data_x);
			cJSON_AddItemToArray(data_arr,app_data_y);
			cJSON_AddItemToArray(data_arr,app_data_z);

			cJSON_AddItemToArray(data_arr,modbus_data_tmp);
			cJSON_AddItemToArray(data_arr,modbus_data_hum);
			cJSON_AddItemToArray(data_arr,modbus_data_air);

			cJSON_AddNumberToObject(data_ret,"type",1);
    		cJSON_AddNumberToObject(data_ret,"result",0);

			//添加数组到对象中
			cJSON_AddItemToObject(data_ret,"data",data_arr);
		}

		
	}
	else if(node_recv->valueint == 2)
	{
		struct msgbuf send_buf;
		send_buf.mtype = 1;
		node_recv = cJSON_GetObjectItem(json_recv,"data");
		node_recv_data = cJSON_GetObjectItem(node_recv,"key");
		//M0
		if(atoi(cJSON_Print(node_recv_data)) <= 6 )
		{
			log_console("-----------------\n");
			strcpy(send_buf.mdata,recv_buf);
			log_console("%s\n",send_buf.mdata);
			if(msg_queue_send("hfs", &send_buf, sizeof(send_buf), 0) < 0)
            {
               	log_console("msg_queue_send error\n");
                return NULL;
            }
		}
		//modbus
		else if(atoi(cJSON_Print(node_recv_data)) >= 101 && atoi(cJSON_Print(node_recv_data)) <= 105)
		{
			strcpy(send_buf.mdata,recv_buf);
			if(msg_queue_send("ssy", &send_buf, sizeof(send_buf), 0) < 0)
            {
                printf("msg_queue_send error\n");
                return NULL;
            }
		}
		//app
		else if(atoi(cJSON_Print(node_recv_data)) >= 201 && atoi(cJSON_Print(node_recv_data)) <= 206)
		{
			strcpy(send_buf.mdata,recv_buf);
			if(msg_queue_send("zz", &send_buf, sizeof(send_buf), 0) < 0)
            {
                printf("msg_queue_send error\n");
                return NULL;
            }
		}
	}
	
	report_json(cJSON_Print(data_ret));
	
	return 0;
}
